package br.usjt.component.login.assembler;

import static br.com.usjt.component.commons.login.util.ValidationUtil.isNull;
import static br.com.usjt.component.commons.login.util.ValidationUtil.not;
import static br.usjt.component.login.assembler.LoginAssembler.associarLoginParaUsuario;
import static br.usjt.component.login.assembler.LoginAssembler.converterParaLoginDTOUsando;

import java.util.ArrayList;
import java.util.List;

import br.usjt.component.login.dto.LoginDTO;
import br.usjt.component.login.dto.UsuarioDTO;
import br.usjt.component.login.model.Login;
import br.usjt.component.login.model.Usuario;

public class UsuarioAssembler {

    private Usuario entity;
    private UsuarioDTO dto;

    public UsuarioAssembler(Usuario entity) {
        this.entity = entity;
        toDTO();
    }

    public UsuarioAssembler(UsuarioDTO dto) {
        this.dto = dto;
        toEntity();
    }

    public Usuario getEntity() {
        return entity;
    }

    public UsuarioDTO getDto() {
        return dto;
    }

    private void toEntity() {
        this.entity = new Usuario();

        this.entity.setCep(dto.getCep());
        this.entity.setCpf(dto.getCpf());
        this.entity.setEmail(dto.getEmail());
        this.entity.setEndereco(dto.getEndereco());
        this.entity.setId(dto.getId());
        this.entity.setNome(dto.getNome());
        this.entity.setRg(dto.getRg());
        this.entity.setSobrenome(dto.getSobrenome());
        this.entity.setTelefoneCelular(dto.getTelefoneCelular());
        this.entity.setTelefoneComercial(dto.getTelefoneComercial());
        this.entity.setStatus(dto.isAtivo());

    }

    private void toDTO() {
        this.dto = new UsuarioDTO();

        this.dto.setCep(entity.getCep());
        this.dto.setCpf(entity.getCpf());
        this.dto.setEmail(entity.getEmail());
        this.dto.setEndereco(entity.getEndereco());
        this.dto.setId(entity.getId());
        this.dto.setNome(entity.getNome());
        this.dto.setRg(entity.getRg());
        this.dto.setSobrenome(entity.getSobrenome());
        this.dto.setTelefoneCelular(entity.getTelefoneCelular());
        this.dto.setTelefoneComercial(entity.getTelefoneComercial());
        this.dto.setAtivo(entity.isStatus());

    }

    public static Usuario converterParaUsuarioUsando(UsuarioDTO dto) {

        Usuario user = new UsuarioAssembler(dto).getEntity();
        return associarLoginParaUsuario(dto.getLoginDTO(), user);
    }

    public static UsuarioDTO converterParaUsuarioDTOUsando(Usuario usuario) {

        if (not(isNull(usuario.getLogin()))) {
            LoginDTO loginDto = converterParaLoginDTOUsando(usuario.getLogin());
            return loginDto.getUsuarioDTO();
        }
        return new UsuarioAssembler(usuario).getDto();
    }

    public static List<UsuarioDTO> converterParaListaUsuarioDTOsUsando(List<Usuario> usuarios) {

        List<UsuarioDTO> usuariosDtos = new ArrayList<UsuarioDTO>();
        for (Usuario usuario : usuarios) {
            if (not(isNull(usuario))) {
                usuariosDtos.add(converterParaUsuarioDTOUsando(usuario));
            }
        }

        return usuariosDtos;
    }

    static void associarUsuarioParaLogin(UsuarioDTO dto, Login login) {

        if (not(isNull(dto))) {
            Usuario u = new UsuarioAssembler(dto).getEntity();
            u.setLogin(login);
            login.setUsuario(u);
        }
    }

    static void associarUsuarioDTOParaLoginDTO(Usuario usuario, LoginDTO loginDto) {

        if (not(isNull(usuario))) {
            UsuarioDTO u = new UsuarioAssembler(usuario).getDto();
            u.setLoginDTO(loginDto);
            loginDto.setUsuarioDTO(u);
        }
    }

    public static void toEntityAttached(Usuario undetached, Usuario attached) {

        attached.setCep(undetached.getCep());
        attached.setCpf(undetached.getCpf());
        attached.setEmail(undetached.getEmail());
        attached.setEndereco(undetached.getEndereco());
        attached.setNome(undetached.getNome());
        attached.setRg(undetached.getRg());
        attached.setSobrenome(undetached.getSobrenome());
        attached.setStatus(undetached.isStatus());
        attached.setTelefoneCelular(undetached.getTelefoneCelular());
        attached.setTelefoneComercial(undetached.getTelefoneComercial());

    }

}
